﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Text;

namespace Sinacor.Tools.Dado
{
    public class Modulo
    {
        private string configKey = "ORACLETFW";
        public List<Entidade.Modulo> consultar(Entidade.Modulo modulo)
        {
            return this.filtrar(this.consultarXml(), modulo);
        }

        public List<Entidade.Modulo> consultar()
        {
            return this.consultarXml();
        }

        private List<Entidade.Modulo> filtrar(List<Entidade.Modulo> modulos, Entidade.Modulo modulo)
        {
            int qtdeLoops = modulos.Count;
            List<Entidade.Modulo> listaFiltrada = new List<Sinacor.Tools.Entidade.Modulo>();
            for (int i = 0; i < qtdeLoops; i++)
            {
                if (modulos[i].Id == modulo.Id)
                {
                    listaFiltrada.Add(modulos[i]);
                    return listaFiltrada;
                }
                else if (modulos[i].Descricao == modulo.Descricao)
                {
                    listaFiltrada.Add(modulos[i]);
                }
            }
            return listaFiltrada;
        }

        /// <summary>
        /// busca os módulos cadastrados no xml .config, feito rapidamente, por isso 
        /// não usa XSD nem xpath num xml personalizado
        /// </summary>
        /// <param name="modulo"></param>
        /// <returns></returns>
        private List<Entidade.Modulo> consultarXml()
        {
            string modulo = System.Configuration.ConfigurationManager.AppSettings["MODULOS"];
            if (string.IsNullOrEmpty(modulo)) throw new Exception("Não existem módulos cadastrados no arquivo de configuração.");
            string[] modulos = modulo.Replace("\r", "").Replace("\n", "").Split(';');
            int qtdeLoops = modulos.Length;

            Entidade.Modulo entidade = null;
            List<Entidade.Modulo> listaModulos = new List<Sinacor.Tools.Entidade.Modulo>();
            for (int i = 0; i < qtdeLoops; i++)
            {
                if ((!string.IsNullOrEmpty(modulos[i])) && modulos[i].IndexOf(',') > -1)
                {
                    string [] propriedadesModulo = modulos[i].Split(',');
                    entidade = new Sinacor.Tools.Entidade.Modulo();
                    entidade.Id = propriedadesModulo[0];
                    entidade.Descricao = propriedadesModulo[1];
                    entidade.InicioRangeMensagem = Convert.ToInt32(propriedadesModulo[2]);
                    entidade.FimRangeMensagem = Convert.ToInt32(propriedadesModulo[3]);
                }
                else
                {
                    entidade.Id = modulos[i];
                    entidade.Descricao = entidade.Id;
                }
                listaModulos.Add(entidade);
            }
            return listaModulos;
        }


        public object buscarProximoId(Entidade.Modulo entidade)
        {
            object retorno = null;
            string sql = string.Format(@" select max(NVL(codigoexcecao,0)) + 1 from TFWEXCECAO where modulo = '{0}' ", entidade.Id.Trim());
            ResourceAccess<Sinacor.Tools.Entidade.MensagemExcecao> dados = new ResourceAccess<Sinacor.Tools.Entidade.MensagemExcecao>();

            using (IDbCommand cmd = dados.getCommand(sql, CommandType.Text, configKey))
            {
                retorno = cmd.ExecuteScalar();
                if (retorno == DBNull.Value)
                    retorno = null;
                cmd.Connection.Close();
            }
            return retorno;
        }
    }
}
